#ifndef NctiSystemParams_H
#define NctiSystemParams_H
#include "dcl_ncti_plugin.h"
#include "ncti_base.h"
namespace NCTI
{

#define NCTI_DEFINE_ARG(OBJECT_TYPE,OBJECT)\
private:\
OBJECT_TYPE m_##OBJECT;\
public:\
void Set##OBJECT(const OBJECT_TYPE& i_##OBJECT){ m_##OBJECT = i_##OBJECT;}\
const OBJECT_TYPE& Get##OBJECT(){return m_##OBJECT;}

#define NCTI_DEFINE_ARG_VAL(OBJECT_TYPE,OBJECT,VALUES)\
private:\
OBJECT_TYPE m_##OBJECT{ VALUES };\
public:\
void Set##OBJECT(const OBJECT_TYPE& i_##OBJECT){ m_##OBJECT = i_##OBJECT;}\
const OBJECT_TYPE& Get##OBJECT(){return m_##OBJECT;}

	struct ParamsColor
	{
		Ncti_Integer iRed;
		Ncti_Integer iGreen;
		Ncti_Integer iBlue;
		Ncti_Integer iAlpha;
		ParamsColor() {
			iRed = 0;
			iGreen = 0;
			iBlue = 0;
			iAlpha = 255;
		}
		ParamsColor(Ncti_Integer red, Ncti_Integer green, Ncti_Integer blue, Ncti_Integer alpha = 255)
			:iRed(red)
			,iGreen(green)
			,iBlue(blue)
			,iAlpha(alpha)
		{ }
	};
	/**
	 * @brief System configuration class
	 */
	class DECL_NCTI_PLUGIN NctiSystemParams
	{
	public:
		NctiSystemParams();
		~NctiSystemParams();
	public:
		/**
		 * @brief Get system configuration class instance
		 * @return NctiSystemParams
		 */
		static NctiSystemParams* instance();
		//void LoadJsonFile(const std::string& file);
	private:
		
		NCTI_DEFINE_ARG_VAL(Ncti_Integer, ThemeColor, 0);// 主题颜色
		NCTI_DEFINE_ARG_VAL(Ncti_Integer, Language, 0);// 语言

		// 背景渐变色
		NCTI_DEFINE_ARG_VAL(ParamsColor, TopColor, ParamsColor(0x4e, 0x4e, 0x4e));// 背景渐变色
		NCTI_DEFINE_ARG_VAL(ParamsColor, BottomColor, ParamsColor(0xd3, 0xd3, 0xd3));// 背景渐变色

		//模型
		NCTI_DEFINE_ARG_VAL(ParamsColor, FaceColor, ParamsColor(145, 158, 186));// 面
		NCTI_DEFINE_ARG_VAL(ParamsColor, LineColor, ParamsColor(0, 0, 0));// 线
		NCTI_DEFINE_ARG_VAL(ParamsColor, VertexColor, ParamsColor(248, 203, 22));// 点
		NCTI_DEFINE_ARG_VAL(ParamsColor, HighlightColor, ParamsColor(245, 128, 15));// 高亮

		//草图绘制
		NCTI_DEFINE_ARG_VAL(ParamsColor, LineSegmentColor, ParamsColor(255, 255, 255));// 线段
		NCTI_DEFINE_ARG_VAL(ParamsColor, DimensionLineColor, ParamsColor(30, 179, 65));// 尺寸线
		NCTI_DEFINE_ARG_VAL(ParamsColor, GridLineColor, ParamsColor(77, 93, 128));// 网格线

		//对象显示模式
		NCTI_DEFINE_ARG_VAL(Ncti_Boolean, FaceState, true );
		NCTI_DEFINE_ARG_VAL(Ncti_Boolean, EdgeState, true);
		NCTI_DEFINE_ARG_VAL(Ncti_Boolean, VertexState, false);
		//操作轴
		NCTI_DEFINE_ARG_VAL(Ncti_Boolean, OperatingAxis, true);

		//控制台
		NCTI_DEFINE_ARG_VAL(Ncti_Boolean, Console, true);

		//脚本编辑器
		NCTI_DEFINE_ARG_VAL(Ncti_Boolean, ScriptEditor, true);

		//备份
		//备份开启或关闭
		NCTI_DEFINE_ARG_VAL(Ncti_Boolean, AutoSaveValid, false);
		NCTI_DEFINE_ARG_VAL(Ncti_Integer, AutoSaveTime, 300);//备份时间
		NCTI_DEFINE_ARG(std::string, AutoSaveFolder);//备份路径

		// 渲染设置
		// 模型线
		NCTI_DEFINE_ARG_VAL(Ncti_Integer,LineType, 0);// 线型
		NCTI_DEFINE_ARG_VAL(Ncti_Double, LineWidth, 1);// 线宽

		// 模型背面是否显示
		NCTI_DEFINE_ARG_VAL(Ncti_Boolean, ShowBackColor, true);
		NCTI_DEFINE_ARG_VAL(ParamsColor, BackColor, ParamsColor(145, 158, 186));// 背面颜色

		// 高亮轮廓
		NCTI_DEFINE_ARG_VAL(Ncti_Boolean, ShowContour, true);
		NCTI_DEFINE_ARG_VAL(ParamsColor, ContourColor, ParamsColor(245, 128, 15));// 轮廓颜色

		// 帧率显示
		NCTI_DEFINE_ARG_VAL(Ncti_Boolean, OpenRenderDisplayTime, false);
	};
}
#endif
